#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <unistd.h>
using namespace std;

int flag = 100;

void showtid(pthread_t& tid)
{
    printf("tid: 0x%lx\n", tid);
}

string FormatId(const pthread_t& tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);
    return id;
}

void* routine(void* args)
{
    string name = static_cast<const char*>(args);
    pthread_t tid = pthread_self();
    int cnt = 5;
    while(cnt)
    {
        std::cout << "我是一个新线程: 我的名字是: " << name << " 我的Id是: " << FormatId(tid) << std::endl;

        sleep(1);
        cnt--;
        flag++;
    }

    // return nullptr;

    //暂时可以理解为线程退出时的退出码
    return (void*)666;
}

int main()
{
    pthread_t tid;
    int n = pthread_create(&tid, nullptr, routine, (void*)"thread-1");

    showtid(tid);

    int cnt = 5;
    while(cnt)
    {
        cout << "我是main线程: 我的名字是:  main-thread 我的Id是: " << FormatId(pthread_self()) << " flag: " << flag << endl;
        sleep(1);
        cnt--;
    }

    void* ret = nullptr;
    //等待的目标线程，如果发生异常整个进程也异常，这里的异常退出码没有意义
    //join都是在线程正常结束后，接收退出码
    pthread_join(tid, &ret);
    cout << "ret is: " << (long long int)ret << endl;
    return 0;
}

//C++11也有线程
// #include <thread>

// void hello()
// {
//     while(true)
//     {
//         sleep(1);
//         cout << "我是新线程: hello mihayou"  << ", pid: " << getpid() << endl;
//     }
// }

// int main()
// {
//     thread t(hello);
//     while(true)
//     {
//         cout << "我是主线程..." << ", pid: " << getpid() << endl;
//         sleep(1);
//     }

//     t.join();
//     return 0;
// }

// void* threadrun(void* args)
// {
//     string name = (const char*)args;
//     while(true)
//     {
//         sleep(1);
//         cout << "我是新线程: " << name << ", pid: " << getpid() << endl;

//         //子线程出现异常，整个进程也会崩溃
//         int a = 10;
//         a /= 0;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void*)"thread-1");

//     while(true)
//     {
//         cout << "我是主线程..." << ", pid: " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }